﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.SqlClient;

namespace DBA
{
    //obliga a definir parametros
    delegate void ParametrosSP(ref SqlCommand comando, DataRow Registro);
    delegate void DataReader(SqlDataReader Read);

    class CDBAdmin
    {

        //ahora usa solo SQL Server, pero usando esta clase en el codigo, exporar todo a un MySQL o Oracle 
        //es mas simple, ya qu modificaria las primitivas de esta clase
        CDBAdmin_Data data;

        public CDBAdmin(string ConexionBD)
        {
            data = new CDBAdmin_Data();

            data.coneccion = new SqlConnection(ConexionBD);
            data.dataAdapter = new SqlDataAdapter();

            data.dataAdapter.SelectCommand = new SqlCommand();
            data.command = new SqlCommand();
        }

        public CDBAdmin(string DataSource, string InitialCatalog)
        {
            SqlConnectionStringBuilder BuildString = new SqlConnectionStringBuilder();

            BuildString.DataSource = DataSource;
            BuildString.InitialCatalog = InitialCatalog;
            BuildString.IntegratedSecurity = true;

            data = new CDBAdmin_Data();

            data.coneccion = new SqlConnection(BuildString.ConnectionString);
            data.dataAdapter = new SqlDataAdapter();

            data.dataAdapter.SelectCommand = new SqlCommand();
            data.command = new SqlCommand();
        }

        //optimiza los timepos de acceso a la base de datos al conectar una unica vez
        public void Conectar()
        {
            //le asigno la conexion al dataAdapter
            data.dataAdapter.SelectCommand.Connection = data.coneccion;
            data.coneccion.Open();
            data.command.Connection = data.coneccion;
        }

        public void Desconectar()
        {
            data.coneccion.Close();
        }
        
        public DataSet ExecuteQry(string Query)
        {
            DataSet dataSet = new DataSet();
            //seteo la consulta, la conneccion ya fue definida en Conectar
            data.dataAdapter.SelectCommand.CommandText = Query;

            data.dataAdapter.Fill(dataSet);
            return dataSet;
        }

        public void ExecuteSP(string SpName ,ParametrosSP definirParametros, DataRow registro)
        {
            data.command.Parameters.Clear();
            SqlCommand comandoBufff = new SqlCommand();
            //para no perder nada del data.command que es inaxecible por el delegado
            comandoBufff = data.command;
            definirParametros(ref comandoBufff, registro);
            //recupero el comando con los parametros
            data.command = comandoBufff;

            //empieso el proceso para ejecutar el SP
            data.command.CommandType = CommandType.StoredProcedure;
            data.command.CommandText = SpName;
            data.command.ExecuteNonQuery();
        }

        public void ExecuteQryReader(string Qry, DataReader Read)
        {
            data.command.CommandType = CommandType.Text;
            data.command.CommandText = Qry;
            data.dataReader = data.command.ExecuteReader();

            DataSet dataSet = new DataSet();

            while(data.dataReader.Read())
            {                
                Read(data.dataReader);
            }
        }
    }
}
